package atividades.mochila;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 * 
 * 
 * @author Dennis Fernandes - dennisxsf@gmail.com
 * @version
 * 		<p><b>v0.1 - 16/11/2014</b>
 * 		
 * 		</p>
 */
public class Mochila extends JPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	//
	private JLabel label_problemaDaMochila;
	private JLabel label_valoresEntrada;
	private JLabel lbl_solucao;
	private JLabel imagem;
	private JScrollPane scrollPane_itens;
	private JScrollPane scrollPane_solucao;
	private JPanel panel_itens;
	private JTable table_solucao;
	private JButton btn_iniciar;
	//
	private ArrayList<Item> itens;
	private Iteracao[][] iteracao;
	private final int CAPACIDADE_MOCHILA = 15;
	private final int QUANTIDADE_ITENS = 6;
	
	/**
	 * 
	 */
	public Mochila() {
		initComponents();
		startListeners();
	}
	
	/**
	 * 
	 */
	private void initComponents() {
		
		setLayout(null);
		
		label_problemaDaMochila = new JLabel("Problema da Mochila");
		label_problemaDaMochila.setBounds(202, 11, 189, 27);
		label_problemaDaMochila.setFont(new Font("Comic Sans MS", Font.BOLD, 19));
		add(label_problemaDaMochila);
		
		label_valoresEntrada = new JLabel("Valores de entrada:");
		label_valoresEntrada.setBounds(21, 38, 144, 14);
		add(label_valoresEntrada);
		
		scrollPane_itens = new JScrollPane();
		scrollPane_itens.setBounds(21, 51, 554, 228);
		add(scrollPane_itens);
		
		panel_itens = new JPanel();
		scrollPane_itens.setViewportView(panel_itens);
		panel_itens.setLayout(new BorderLayout(0, 0));
	
		lbl_solucao = new JLabel("Solu\u00E7\u00E3o:");
		lbl_solucao.setBounds(21, 287, 63, 14);
		add(lbl_solucao);
		
		scrollPane_solucao = new JScrollPane();
		scrollPane_solucao.setBounds(21, 301, 554, 228);
		add(scrollPane_solucao);
		
		table_solucao = new JTable();
		scrollPane_solucao.setViewportView(table_solucao);
		
		btn_iniciar = new JButton("Iniciar");
		btn_iniciar.setBounds(486, 11, 89, 23);
		add(btn_iniciar);
		
		/* Carregando a imagem na tela */
		ImageIcon icon = new ImageIcon( Mochila.class.getResource("/atividades/mochila/images/itens_mochila.jpg") );
		imagem = new JLabel( icon );
		panel_itens.add( imagem );
		
		
	}
	
	/**
	 * 
	 */
	public void startListeners() {
		
		btn_iniciar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				itens = new ArrayList<Item>();
				// ID - Peso - Valor
				Item laranja = new Item(1, 5, 100);
				Item amarelo = new Item(2, 3, 120);
				Item azul = new Item(3, 8, 25);
				Item verde = new Item(4, 2 ,40);
				Item vermelho = new Item(5, 1, 50);
				Item azulPiscina = new Item(6, 6, 60);
				itens.add(laranja);
				itens.add(amarelo);
				itens.add(azul);
				itens.add(verde);
				itens.add(vermelho);
				itens.add(azulPiscina);
				
				algoritmo();
				criarTabelaSolucao();
			}
		});
		
	}
	
	/**
	 * 
	 */
	public void algoritmo(){
		iteracao = new Iteracao[QUANTIDADE_ITENS + 1][CAPACIDADE_MOCHILA + 1];
		for (int linha = 0; linha < QUANTIDADE_ITENS+1; linha++) {
			for (int coluna = 0; coluna < CAPACIDADE_MOCHILA+1; coluna++) {
				if(linha == 0 || coluna == 0){
					iteracao[linha][coluna] = new Iteracao();
				} else {
					int weight = itens.get(linha-1).getPeso();
					if(weight > coluna){
						iteracao[linha][coluna] = new Iteracao(iteracao[linha-1][coluna].getItens());
					} else {
						int amount = itens.get(linha-1).getValor();
						int amount1 = iteracao[linha-1][coluna].getValor();
						int amount2 = iteracao[linha-1][coluna-weight].getValor() + amount;
						if(amount1 > amount2){
							iteracao[linha][coluna] = new Iteracao(iteracao[linha-1][coluna].getItens());
						} else {
							iteracao[linha][coluna] = new Iteracao(iteracao[linha-1][coluna-weight].getItens());
							iteracao[linha][coluna].getItens().add(itens.get(linha-1));
						}
					}
				}
			}
		}
	}
	
	/**
	 * 
	 */
	public void criarTabelaSolucao(){
		String[] columnNames = new String[CAPACIDADE_MOCHILA+2];
		columnNames[0] = "";
		for (int i = 1; i < columnNames.length; i++) {
			columnNames[i] = String.valueOf(i-1);
		}

		DefaultTableModel model = new DefaultTableModel(null, columnNames);
		for (int i = 0; i < QUANTIDADE_ITENS+1; i++) {
			String[] linha = new String[CAPACIDADE_MOCHILA+2];
			for (int j = 0; j < linha.length; j++) {
				if(j == 0){
					linha[j] = String.valueOf(i);
				} else{
					linha[j] = String.valueOf(iteracao[i][j-1].getValor());
				}
			}
			model.addRow(linha);
		}

		table_solucao.setModel(model);
		this.revalidate();
		this.repaint();
	}
}
